import Koa from 'koa';
import userRouter from './router/user.js';
import bodyParser from 'koa-bodyparser';
import koaStatic from 'koa-static';
import koaBody from 'koa-body';
import path from 'path';
import koaMount from 'koa-mount';
import multer from '@koa/multer';

const app = new Koa();

//使用koa-bodyparser中间件可以把koa2上下文的json数据解析到ctx.request.body中
app.use(bodyParser())
// 使用koa-body中间件 解析form-data格式，multipart: true 开启解析,但是开启后@koa/multer就不支持了 上传文件使用：@koa/multer中间件
// app.use(koaBody({ multipart: false }))

// 使用@koa/multer中间件 也可以解析form-data格式，multer().any()就是解析所有 特定接口上传form-data格式就行，不要全部开启
// app.use(multer().any())


// 静态资源加载 此为koa-static中间件 访问直接localhost:3000/img1.png即可 因为这个中间件是全局加载
// app.use(koaStatic(path.join(__dirname, './static')))
// 使用koa-mount 可以给任何中间件添加前缀 比如这里给koa-static中间件添加前缀 /static 访问直接localhost:3000/static/img1.png
app.use(koaMount('/static', koaStatic(path.join(__dirname, './static'))))

// 监听错误中间件
app.use(async (ctx, next) => {
    try {
        await next();
    } catch (error) {
        ctx.send(error, 500);
        ctx.app.emit('error', error); // 触发应用层级错误事件
    }
})

// 封装自定义中间件 send消息和数据
app.use(async (ctx, next) => {
    ctx.send = function (message, status = 400, data) {
        ctx.body = {
            status,
            message: message instanceof Error ? message.message : message,
            data: data
        }
    }
    await next();
})

app.use(async (ctx, next) => {
    console.log(ctx.request.url);
    ctx.body = '路径不存在';
    if (ctx.request.url === '/') {
        ctx.body = 'Hello World'
    }
    await next();
})

app.use(koaMount('/api', userRouter.routes(), userRouter.allowedMethods()));

// 全局错误事件监听
app.on('error', (error) => {
    console.error("全局错误事件监听:",error);
});

app.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
})